import os
from concurrent.futures import ThreadPoolExecutor

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from requests import Session

options = webdriver.ChromeOptions()  # 创建谷歌浏览器的options对象来接收浏览器的相关设置

options.add_argument('--start-maximized')  # 最大化窗口
options.add_argument('--incognito')  # 无痕浏览
options.add_argument('--disable-extensions')  # 禁用浏览器的扩展程序,避免干扰网站的打开
options.add_experimental_option("detach", True)  # 禁止浏览器自动关闭
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)

options.add_argument('--headless')
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"',)
options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options)  # 创建谷歌浏览器驱动对象

driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source':'''
    Object.defineProperty(navigator, 'webdriver',{get:() => false})
    '''
})

driver.get('https://www.manhua3.com/388333-117592.html')

session = Session()
session.headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
}

path = '一人之下'
if not os.path.isdir(path):
    os.mkdir(path)

def download_img(file_name:str,url:str):
    """
    线程任务下载漫画图片
    :param file_name:图片名称
    :param url: 图片地址
    :return:
    """
    res = session.get(url)
    with open(os.path.join(path,file_name),'wb') as fp:
        fp.write(res.content)   #因为是图片所有只需要保留数据的源码格式 不要text进行解码
    print(file_name,'下载完成')


wait = WebDriverWait(driver, 6) #设置等待时间
for page in range(11,12):
    driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')  #执行js代码  滑动到底部
    images = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'lazy-read')))  #得到页面上所有图片元素标签

    # 获取页面上的每一张图片并且请求图片地址进行下载
    # for i,image in enumerate(images):
    #     url = image.get_attribute('data-src')     #得到data-src元素的属性值value
    #     download_img()      #这样一页一页的下太慢了  我们使用多线程下载

    with ThreadPoolExecutor(max_workers=16) as executor:    #创建线程池
        # 创建任务列表  任务要传入两个参数所以为推到表达式前面为一个包含两个元素的元组 第一个为图片名称第二个为图片地址
        urls = [(f'{page}_{i}.jpg',image.get_attribute('data-src')) for i,image in enumerate(images)]
        # 线程调用任务函数
        executor.map(lambda x: download_img(*x),urls)
    #根据a标签的文本获取元素（模糊定位 ）==》(By.PARTIAL_LINK_TEXT, '模糊文字 ')
    wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT,'下一章'))).click()    #把当前页的所有漫画图片下载完毕后，点击下一章


driver.quit()

